import os

import re


def do_test_1():
    """
    w 以写方式打开，
    a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
    r+ 以读写模式打开
    w+ 以读写模式打开 (参见 w )
    a+ 以读写模式打开 (参见 a )
    rb 以二进制读模式打开
    wb 以二进制写模式打开 (参见 w )
    ab 以二进制追加模式打开 (参见 a )
    rb+ 以二进制读写模式打开 (参见 r+ )
    wb+ 以二进制读写模式打开 (参见 w+ )
    ab+ 以二进制读写模式打开 (参见 a+ )
    """
    with open('test.txt', 'w', encoding='utf8') as f:
        f.write('耿雪龙')


def do_test_2():
    """
    文件遍历
    """
    rootdir = os.getcwd()
    print("rootdir is:" + rootdir)
    for parent, dirnames, filenames in os.walk(rootdir):
        print('第一个for, 其实一共也就一个for')
        # 三个参数：分别返回 1.父目录 2.所有文件夹名字（不含路径） 3.所有文件名字
        for dirname in dirnames:  # 输出文件夹信息
            print("parent is:" + parent)
            print("dirname is" + dirname)

        for filename in filenames:  # 输出文件信息
            print("parent is:" + parent)
            print("filename is:" + filename)
            print("the full name of the file is:" + os.path.join(parent, filename))  # 输出文件路径信息
    print("遍历结束")


def do_test_3():
    """
    模块:
    模块就是一个保存了 Python 代码的文件。模块能定义函数，类和变量。模块里也能包含可执行的代码。
    import 导入, 如果导入的是一个包, 则该包必须模块化, 也就是必须含义__init__.py,导入的内容的实质
    也是导入了__init__.py的内容
    在import的路径中, 路径的构成只是常规的文件夹罢了, 此处不涉及模块相关要求
    import导入的标准内容应该是一个module.py文件, 次之也可以是模块化的包, 但本质也是一个.py文件, 其实
    也可导入模块的一部分, 导入的东西进入该命名空间, 导入的过程中会从头到尾执行一边module.py, 将其可执行部分给执行了
    只用被导入的内容才能直接访问到, 如果导入的是模块, 那么只有模块可以被直接访问到, 使用其中内容时需要先访问模块名.
    如果导入的是模块的一部分, 比如函数, 那么这个导入的函数可以被直接访问到, 如果使用模块名的方式反而不行, 应为模块没有直接导入, 不能被访问到


    一个模块只会被导入一次，不管执行了多少次 import。

    from ** import ** ,这里的from可以的模块, 也可以是路径, 但导入的内容必须符合模块要求(.py/.py内的内容/模块化的包)
    """


def do_test_4():
    """
    正则表达式
    Python 的 re 模块提供了对正则表达式的支持。主要用到的方法列举如下:
    pattern = re.compile(string[,flag])

    re.match(pattern, string[, flags])
    re.search(pattern, string[, flags])
    re.split(pattern, string[, maxsplit])
    re.findall(pattern, string[, flags])
    re.finditer(pattern, string[, flags])
    re.sub(pattern, repl, string[, count])
    re.subn(pattern, repl, string[, count])

    pattern 可以理解为一个匹配模式，需要利用 re.compile 方法获得这个匹配模式。
    参数 flag 是匹配模式，取值可以使用按位或运算符'|'表示同时生效，比如 re.I | re.M。
    ? re.I(全拼：IGNORECASE): 忽略大小写（括号内是完整写法，下同）
    ? re.M(全拼：MULTILINE): 多行模式，改变'^'和'$'的行为（参见上图）
    ? re.S(全拼：DOTALL): 点任意匹配模式，改变'.'的行为
    ? re.L(全拼：LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
    ? re.U(全拼：UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于 unicode 定义的字符属性
    ? re.X(全拼：VERBOSE): 详细模式。这个模式下正则表达式可以是多行，忽略空白字符，并可以加入注释


    re.match(pattern, string), 要求string必须从第一个字符开始有子串匹配pattern
    re.search(pattern, string), 要求string有子串匹配pattern


    正则表达式规则:
    + 前面的字符出现一次或多次
    * 前面的字符出现零次或多次
    ? 前面的字符出现零次或一次
    $ 结尾
    (): 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用
    ^ : 匹配输入字符串的开始位置, 除非在方括号内
    | 指明两项之间的一个选择
    [..] 其中出现的所有字符
    [^..] 匹配除了出现的所有字符
    [-] 匹配一个区间, 例如 [a-z] 匹配所有小写字母, [a-z0-9] 匹配所有小写字母和数字
    . 匹配除换行符（\n、\r）之外的任何单个字符，相等于 [^\n\r]
    \s \S : \s 是匹配所有空白符，包括换行，\S 非空白符，不包括换行。
    \w: 匹配字母、数字、下划线。等价于 [A-Za-z0-9_]

    限定符:
    限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种
    * 和 + 限定符都是贪婪的，因为它们会尽可能多的匹配文字，只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。

    定位符:
    ^ : 匹配输入字符串的开始位置
    $ : 匹配输入字符串的末尾
    \b : 匹配一个单词边界，也就是指单词和空格间的位置
    \B : 匹配非单词边界

    注意：不能将限定符与定位符一起使用, 理由显而易见

    选择:
    () 表示捕获分组，() 会把每个分组里的匹配的值保存起来， 多个匹配值可以通过数字 n 来查看(n 是一个数字，表示第 n 个捕获组的内容)。

    """
    pattern_str = r'hello world'
    pattern = re.compile(pattern_str)
    string = 'hello python, my name is gengxuelong, how are you. hello world . have a nice day'
    match = re.match(pattern, "hello world, xsafds ")
    print(match)

    if match:
        # 使用 Match 获得分组信息
        print(match.group())
    else:
        print('1 匹配失败！')

    # 匹配如下内容：单词+空格+单词+任意字符
    m = re.match(r'\w+ \w+ \S*!', 'hello world 哈哈哈!,dfsfsd')
    print(m)
    if m:
        print("m.string:", m.string)
        print("m.re:", m.re)
        print("m.pos:", m.pos)
        print("m.endpos:", m.endpos)
        print("m.lastindex:", m.lastindex)
        print("m.lastgroup:", m.lastgroup)
        print("m.group():", m.group())


def do_test_5():
    """
    计算库 学习

    """


if __name__ == '__main__':
    """"""
    do_test_4()
